/**
 * Created in 2012-3-1.
 */
package com.surekam.mnai.web;

import java.util.Iterator;
import java.util.List;

/**
 * 分页显示组件类型。
 * 
 * @author 吴政
 * 
 * @param <T>
 *            页面中要显示的数据项的类型
 */
public class Pagination<T> implements Iterable<T> {

	/**
	 * 数据项列表。
	 */
	private List<T> itemList;

	/**
	 * 当前页需要显示的数据项列表。
	 */
	private List<T> currentPageItemList;

	/**
	 * 要显示的数据项的起始位置索引。
	 */
	private int startIndex;

	/**
	 * 每页显示的项数。
	 */
	private int itemCountPerPage;

	/**
	 * 当前页面页码。
	 */
	private int currentPageNumber;

	/**
	 * 总页数。
	 */
	private int pageCount;

	/**
	 * 创建一个分页显示组件。
	 * 
	 * @param itemList
	 *            数据项列表
	 * @param startIndex
	 *            当页显示的数据项的起始索引
	 * @param itemCountPerPage
	 *            每页显示的项数
	 * @param currentPageNumber
	 *            当前页面页码
	 * @param pageCount
	 *            总页数
	 */
	public Pagination(List<T> itemList, int startIndex, int itemCountPerPage,
			int currentPageNumber, int pageCount) {
		this.itemList = itemList;
		this.startIndex = startIndex;
		this.itemCountPerPage = itemCountPerPage;
		this.currentPageNumber = currentPageNumber;
		this.pageCount = pageCount;

		initCurrentPageItemList();
	}

	/**
	 * 初始化当前页面数据项列表。
	 */
	private void initCurrentPageItemList() {
		currentPageItemList = itemList.subList(startIndex,
				Math.min(startIndex + itemCountPerPage, itemList.size()));
	}

	/**
	 * @see java.lang.Iterable#iterator()
	 */
	@Override
	public Iterator<T> iterator() {
		return currentPageItemList.iterator();
	}

	/**
	 * 返回当前页面数据项的迭代器。
	 * 
	 * @return 当前页面数据项的迭代器
	 */
	public Iterator<T> getIterator() {
		return iterator();
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}

	public int getItemCountPerPage() {
		return itemCountPerPage;
	}

	public void setItemCountPerPage(int itemCountPerPage) {
		this.itemCountPerPage = itemCountPerPage;
	}

	public int getCurrentPageNumber() {
		return currentPageNumber;
	}

	public void setCurrentPageNumber(int currentPageNumber) {
		this.currentPageNumber = currentPageNumber;
	}

	public int getPageCount() {
		return pageCount;
	}

	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}

}
